<?php

namespace App\Utils;

use Zhuzhichao\IpLocationZh\Ip;

/**
 * 杂项工具方法
 * Class Common
 * @package App\Utils
 */
class RegionIp
{

    protected $message = 'error';
    protected        $data    = [];

    public function get($ip)
    {
        if ($ip == '127.0.0.1') {
            return $this->error('未知IP');
        }
        // 过滤空数据
        if (!$ip) {
            return $this->error('未知IP');
        }

        // 验证ipv4地址合法性
        if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
            return $this->error('未知IP');
        }

        // 请求接口
        $methods = [
            'getMethod'
        ];

        foreach ($methods as $method) {
            $response = $this->$method($ip);
            if ($response) {
                // 如果请求成功，输出请求结果并停止循环
                return $this->success('success',[
                    'ip' => $ip,
                    'country'  => $response['country'] ?? '',// 国家
                    'province' => str_replace('市','',str_replace('省','',$response['province'] ?? '')),// 省份
                    'city'     => str_replace('市','',$response['city'] ?? ''),// 城市
                    'district' => $response['district'],// 县区
                ]);
            }
        }

        return $this->error('未知IP');
    }

    // 接口
    private function getMethod($ip)
    {
        $res = Ip::find($ip);
        return [
            'country'  => $res[0] ?? '',// 国家
            'province' => $res[1] ?? '',// 省份
            'city'     => $res[2] ?? '',// 城市
            'district' => $res[3] ?? '',// 县区
        ];
    }

    /**
     * 返回成功结果
     * @param string $message
     * @param mixed $data
     * @return bool
     */
    protected function success(string $message = 'success', $data = []): bool
    {
        $this->message = $message;
        $this->data    = $data;
        return true;
    }

    /**
     * 返回失败结果
     * @param string $message
     * @param mixed $data
     * @return bool
     */
    protected function error(string $message = 'error', $data = []): bool
    {
        $this->message = $message;
        $this->data    = $data;
        return false;
    }

    /**
     * 获取成功数据
     * @return mixed
     */
    public function getData()
    {
        return $this->data;
    }

    /**
     * 获取消息
     * @return string
     */
    public function getMessage(): string
    {
        return $this->message;
    }

}